// npm 7.0版本后不再支持，因为 preinstall钩子会在安装过依赖包后再触发
// pnpm 6.21版本开始新增了 pnpm:devPreinstall 脚本，所以将 preinstall 换成 pnpm:devPreinstall 即可达到 NPM 7.0 以下版本的效果。

const PACKAGE_MANAGER_LIST = ['npm', 'cnpm', 'yarn', 'pnpm']

// 获取我们传递的参数<[npm|cnpm|yarn|pnpm]>
const argv = process.argv.slice(2)

// 没有传递参数给与提示并终止运行
if(argv.length === 0) {
  const name = PACKAGE_MANAGER_LIST.join('|')
  console.log(`Please specify the wanted package manager: only-allow <${name}>`)
  process.exit(1)
}

// 我们传递的参数值<npm|cnpm|yarn|pnpm>
const wantedPM = argv[0]

// 乱传参数给与提示并终止运行
if(!PACKAGE_MANAGER_LIST.includes(wantedPM)) {
  const name = PACKAGE_MANAGER_LIST.join(',')
  console.log(`"${wantedPM}" is not a valid package manager. Available package managers are: ${name}.`)
  process.exit(1)
}

// 当前使用的包管理器
const usedPM = getPackageManagerByUserAgent(process.env?.npm_config_user_agent).name

// 当前使用的包管理器和我们约束的不一样 抛出一条错误日志并终止运行
if(usedPM !== wantedPM) {
  console.error(`You are using ${usedPM} but wanted ${wantedPM}`)
  process.exit(1)
}

function getPackageManagerByUserAgent(userAgent) {
  if(!userAgent) {
    throw new Error(`'userAgent' arguments required`)
  }
  const spec = userAgent.split(' ')[0]
  const [name, version] = spec.split('/')
 
  return { name, version }
}